Block

Category

objc2.0,作用:为已经存在的类添加方法

  • 声明私有方法
  • 模拟多继承
  • 不同的功能组织到不同的category里,减少单个文件的体积,由多个开发者共同完成一个类
  • 按需加载想要的category

###Category与Extesion
Extesion是一个匿名类别,在编译期间决定,作为类的组成部分,在编译期间与头文件里的@interface和实现文件里面的@implement组成一个完成的类,与类共存亡.
Extesion一般用来隐藏类的私有信息,只有拥有一个类的源码才能添加,不能为系统类添加Extesion.
Category在运行期决议的,所以无法添加实例变量(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内存布局,这对编译型语言是灾难性的)

###方法覆盖
1)、category的方法没有“完全替换掉”原来类已经有的方法,也就是说如果category和原来类都有methodA,那么category附加完成之后,类的方法列表里会有两个methodA
2)、category的方法被放到了新方法列表的前面,而原来类的方法被放到了新方法列表的后面,这也就是我们平常所说的category的方法会“覆盖”掉原来类的同名方法,这是因为运行时在查找方法的时候是顺着方法列表的顺序查找的,它只要一找到对应名字的方法,就会罢休^_^,殊不知后面可能还有一样名字的方法。

###Category的Load
1)、在类的+load方法调用的时候,我们可以调用category中声明的方法么?
2)、这么些个+load方法,调用顺序是咋样的呢?

1)、可以调用,因为附加category到类的工作会先于+load方法的执行
2)、+load的执行顺序是先类,后category,而category的+load执行顺序是根据编译顺序决定的。

###关联对象
category里面是无法为category添加实例变量的。但是我们很多时候需要在category中添加和对象关联的值,这个时候可以求助关联对象来实现。